local Gladius = _G.Gladius
if not Gladius then
	DEFAULT_CHAT_FRAME:AddMessage(format("Module %s requires Gladius", "Layout"))
end
local L = Gladius.L
local LSM

-- global functions
local pairs = pairs
local next = next
local type = type
local strformat = string.format

local Layout = Gladius:NewModule("Layout", false, false, {
})

function Layout:OnEnable()
	LSM = Gladius.LSM
end

function Layout:OnDisable()
	self:UnregisterAllEvents()
end

function Layout:GetAttachTo()
	return ""
end

function Layout:GetFrame(unit)
	return ""
end

local function SerializeTable(table, defaults)
	for key, value in pairs(table) do
		if (type(value) == "table") then
			if (defaults[key] ~= nil) then
			local t = SerializeTable(value, defaults[key])
			
			if (next(t) ~= nil) then
			table[key] = t
			else
			table[key] = nil
			end
			end
		else
			if (defaults[key] == value) then
			table[key] = nil
			end
		end
	end
	return table
end

function Layout:GetOptions()
	self.layout = ""
	local t = {
		general = {
			type="group",
			name=L["General"],
			order=1,
			args = {
				widget = {
					type="group",
					name=L["Widget"],
					desc=L["Widget settings"],
					inline=true,
					order=1,
					args = {
						layoutInput = {
							type="input",
							name=L["Layout Code"],
							desc=L["Code of your layout."],
							get=function()
								return self.layout
							end,
							set=function(info, value)
								self.layout = value
							end,
							disabled=function()
								return not Gladius.dbi.profile.modules[self.name]
							end,
							multiline=true,
							width="full",
							order=5,
						},
						layoutImport = {
							type="execute",
							name=L["Import layout"],
							desc=L["Import your layout code."],
							disabled=function()
								return not Gladius.dbi.profile.modules[self.name]
							end,
							func=function()
								if (self.layout == nil or self.layout == "") then
									return
								end
								local err, layout = LibStub("AceSerializer-3.0"):Deserialize(self.layout)
								if (not err) then
									Gladius:Print(strformat(L["Error while importing layout: %s"], layout))
									return
								end
								local currentLayout = Gladius.dbi:GetCurrentProfile()
								Gladius.dbi:SetProfile("Import Backup")
								Gladius.dbi:CopyProfile(currentLayout)
								Gladius.dbi:SetProfile(currentLayout)
								Gladius.dbi:ResetProfile()
								Gladius.dbi.profile.modules["*"] = true
								for key, data in pairs(layout) do
									if (type(data) == "table") then
									Gladius.dbi.profile[key] = CopyTable(data)
									else
									Gladius.dbi.profile[key] = data
									end
								end
								Gladius:UpdateFrame()
							end,
							order=10,
						},
						layoutExport = {
							type="execute",
							name=L["Export layout"],
							desc=L["Export your layout code."],
							disabled=function()
								return not Gladius.dbi.profile.modules[self.name]
							end,
							func=function()
								local t = CopyTable(Gladius.dbi.profile)
								self.layout = LibStub("AceSerializer-3.0"):Serialize(SerializeTable(t, Gladius.defaults.profile))
							end,
							order=15,
						},
					},
				},
			},
		},
	}
	return t
end